package main

import (
	"bufio"
	"fmt"
	"io"
	"log"
	"os"
)

func main() {
	fmt.Println("<<<<<测试Go语言IO操作>>>>>")
	LogInit()
	// log.Printf("hello %v, 这是一条测试日志", "tom")
	// CreateFile()
	// ReadFile()
	// wr()
	re()
}

func simple01() {
	var buf [16]byte
	os.Stdin.Read(buf[:])
	os.Stdin.WriteString(string(buf[:]))
}

func ReadFile() {
	file, err := os.Open("../ext/example.txt")
	if err != nil {
		fmt.Println("Open file error, err :", err)
		return
	}
	log.Println(file.Name())
	defer file.Close()
	var buf [128]byte
	var content []byte
	for {
		n, err := file.Read(buf[:])
		if err == io.EOF {
			log.Println("read finish")
			break
		}
		if err != nil {
			log.Println("Open file error, err :", err)
			return
		}
		content = append(content, buf[:n]...)
	}
	log.Println(string(content))
}

/*创建文件*/
func CreateFile() {
	file, err := os.Create("../ext/20240521.txt")
	if err != nil {
		log.Println(err)
		return
	}
	defer file.Close()
	for i := 0; i < 5; i++ {
		file.WriteString("asdasd\n")
		file.Write([]byte("你好按时打算\n"))
	}
}

/*带缓冲区的读写*/
func wr() {
	// 参数2：打开模式，所有模式d都在上面
	// 参数3是权限控制
	// w写 r读 x执行   w  2   r  4   x  1
	file, err := os.OpenFile("../ext/20240521.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666)
	if err != nil {
		return
	}
	defer file.Close()
	// 获取writer对象
	writer := bufio.NewWriter(file)
	for i := 0; i < 10; i++ {
		writer.WriteString("hello\n")
	}
	// 刷新缓冲区，强制写出
	writer.Flush()
}

func re() {
	file, err := os.Open("../ext/20240521.txt")
	if err != nil {
		return
	}
	defer file.Close()
	reader := bufio.NewReader(file)
	for {
		line, _, err := reader.ReadLine()
		if err == io.EOF {
			break
		}
		if err != nil {
			return
		}
		log.Println(string(line))
	}

}

/*定义日志输出：格式+文件*/
func LogInit() {
	logFiile, err := os.OpenFile("./info.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
	if err != nil {
		log.Fatalln("open log file failed, err:", err)
		return
	}
	// 组合一下即可，os.Stdout代表标准输出流
	multiWriter := io.MultiWriter(os.Stdout, logFiile)
	log.SetOutput(multiWriter)
	log.SetFlags(log.Llongfile | log.Lmicroseconds | log.Ldate)
}
